﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Блок кода
    /// </summary>
    public class CompoundStatementElement : StatementElement
    {
        private List<StatementsElement> statements;

        /// <summary>
        /// Команды внутри блока кода
        /// </summary>
        public List<StatementsElement> Statements { get { return statements; } set { statements = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="StartInfo">информация о позиции элемента в коде</param>
        /// <param name="Statements">команды внутри блока кода</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public CompoundStatementElement(TokenInfo StartInfo, List<StatementsElement> Statements, List<TokenInfo> Comments)
            : base(StartInfo, Comments)
        {
            statements = Statements;
        }

        /// <summary>
        /// Представление внутренних команд блока в строковом формате
        /// </summary>
        /// <returns>строковое представление внутренних команд блока</returns>
        protected string InnerStatements()
        {
            if (statements == null) return string.Empty;
            string Statements = Tabulate(statements.Join());
            return Statements.Substring(0, Statements.Length - 2);
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            return string.Format("{0}begin\r\n{1}end", CommentsString(), InnerStatements());
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            foreach (ISyntaxTreeElement element in statements)
                yield return element;
        }
    }
}
